import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains
from config.cfg import *


class TeacherOp:

    # 老师登录
    def teacherLogin(self, username, password):
        # 创建 WebDriver 对象
        self.wd = webdriver.Chrome(service=Service(r'/Users/sunlei/Desktop/chromedriver'))
        self.wd.implicitly_wait(10)

        self.wd.get(f'{g_api_server}/teacher/login/login.html')

        self.wd.find_element(By.ID, "username").send_keys(username)
        self.wd.find_element(By.ID, "password").send_keys(password)
        self.wd.find_element(By.ID, "submit").click()

    # 获取老师主页数据
    def getTeaHomePageInfo(self):
        self.wd.find_element(By.CSS_SELECTOR, 'a[href="#/home"] li').click()

        time.sleep(1)

        eles = self.wd.find_elements(By.CSS_SELECTOR, '#page-wrapper .ng-binding')

        return [ele.text for ele in eles]

    # 获取班级学生数据
    def getTeaClassStudent(self):
        # 找到'班级情况'元素并悬停鼠标
        class_situation = self.wd.find_elements(By.CSS_SELECTOR, 'li[style="cursor: pointer;"]')[-1]
        ActionChains(self.wd).move_to_element(class_situation).perform()

        # 等待动态元素出现, 如班级学生
        time.sleep(1)

        # 注入JavaScript代码, 5秒后冻结界面
        self.wd.execute_script("setTimeout(function(){debugger}, 5000);")

        # 等待5秒后, 浏览器会进入调试模式, 界面被冻住
        time.sleep(5)

        # 点击班级学生
        self.wd.find_element(By.CSS_SELECTOR, '.topbar-main [href="#/student_group"] .menu-title').click()

        self.wd.find_elements(By.CSS_SELECTOR, '.ng-binding .fa-home')[0].click()

        stuInfo = self.wd.find_elements(By.CSS_SELECTOR, '.panel-body .ng-binding')[1].text

        return stuInfo

    # 老师发布作业
    def publishHomework(self, homeworkName):
        # 找到'作业'元素并悬停鼠标
        homework = self.wd.find_elements(By.ID, 'members')[1]
        ActionChains(self.wd).move_to_element(homework).perform()

        # 等待动态元素出现, 如发布作业
        time.sleep(1)

        # 注入JavaScript代码, 5秒后冻结界面
        self.wd.execute_script("setTimeout(function(){debugger}, 5000);")

        # 等待5秒后, 浏览器进入调试模式, 界面被冻住
        time.sleep(5)

        # 点击创建作业
        self.wd.find_element(By.CSS_SELECTOR, 'a[ng-click="show_page_addexam()"] .submenu-title').click()
        time.sleep(2)

        # 编辑作业名字
        element = self.wd.find_element(By.ID, 'exam_name_text')
        element.send_keys(homeworkName)

        # 从题库中选择题目
        self.wd.find_element(By.ID, 'btn_pick_question').click()
        time.sleep(3)

        # 点击选择题目按钮后, 出现新的小界面(在原来的html中又包含了一个html)
        # 这时候需要使用switch_to.frame()进入到这个frame元素中, 才能访问其中的元素
        # !!!注意很重要!!!
        self.wd.switch_to.frame('pick_questions_frame')
        time.sleep(2)

        # 选择三道选择题
        self.wd.find_element(By.ID, 'ZJ_1_0_0_anchor').click()
        time.sleep(2)
        elements = self.wd.find_elements(By.CLASS_NAME, 'btn_pick_question')[:3]
        for ele in elements:
            ele.click()

        # 如果作业名为空, 直接返回None
        if homeworkName == "":
            return None

        # 选择好题目之后 - 点击确定
        self.wd.find_element(By.CLASS_NAME, 'btn-blue').click()
        time.sleep(1)

        # 注意哦, 刚刚我们切换到iframe里面进行操作好了之后, 需要手动切换回原来的主html中
        # !!!注意很重要!!!
        self.wd.switch_to.default_content()
        time.sleep(2)

        # 点击确认添加
        self.wd.find_element(By.ID, 'btn_submit').click()
        time.sleep(3)

        # 弹出提示框 - 点击发布给学生
        self.wd.find_elements(By.CSS_SELECTOR, '.bootstrap-dialog-footer-buttons .btn-primary')[-1].click()
        # self.wd.switch_to.alert.accept() # 这里并不是浏览器的原生弹窗（如alert、confirm或prompt）
        time.sleep(2)

        # 点击发布给学生后进入新的界面, 选择学生
        # !!!进入新的界面需要注意切换!!!

        # mainWindow变量保存当前窗口的句柄
        mainWindow = self.wd.current_window_handle

        for handle in self.wd.window_handles:
            # 先切换到该窗口
            self.wd.switch_to.window(handle)
            # 用该窗口的标题栏字符串判断是不是我们要操作的窗口
            if "下发学习任务" in self.wd.title:
                # 如果是, 那么这时候的WebDriver对象对应的就是该窗口, 正好可以跳出循环
                break
        # 选择第一个学生
        self.wd.find_elements(By.CSS_SELECTOR, '.myCheckbox')[0].click()
        # 点击确认下发
        self.wd.find_element(By.CSS_SELECTOR, '.btn-outlined').click()
        time.sleep(2)
        # 点击确认信息
        self.wd.find_element(By.CSS_SELECTOR, '.btn-primary').click()
        time.sleep(2)
        # 确认提示
        self.wd.find_element(By.CLASS_NAME, 'btn-default').click()

        # 再切换回主html中
        # 通过前面保存的老窗口的句柄，自己切换到老窗口
        self.wd.switch_to.window(mainWindow)
        time.sleep(2)

    # 获取刚刚创建作业的数据
    def getAddHomewordInfo(self):
        # 窗口最大化
        self.wd.maximize_window()

        # 找到'作业'元素并悬停鼠标
        homework = self.wd.find_elements(By.ID, 'members')[1]
        ActionChains(self.wd).move_to_element(homework).perform()

        # 等待动态元素出现, 如已创建作业
        time.sleep(1)

        # 注入JavaScript代码, 5秒后冻结界面
        self.wd.execute_script("setTimeout(function(){debugger}, 5000);")

        # 等待5秒后, 浏览器进入调试模式, 界面被冻住
        time.sleep(5)

        # 点击已创建作业
        self.wd.find_element(By.CSS_SELECTOR, 'a[href="#/exam_search"] .submenu-title').click()
        time.sleep(2)

        # 选择第一个作业
        try:
            homeworkName = self.wd.find_elements(By.CSS_SELECTOR, '.div-search-result-one-text')[0].text
            return homeworkName
        except:
            return None

    # 获取刚刚发布的作业学生完成数据
    def getPublishHomeworkStuInfo(self):
        # 窗口最大化
        self.wd.maximize_window()

        # 找到'作业'元素并悬停鼠标
        homework = self.wd.find_elements(By.ID, 'members')[1]
        ActionChains(self.wd).move_to_element(homework).perform()

        # 等待动态元素出现, 如已发布作业
        time.sleep(1)

        # 注入JavaScript代码, 5秒后冻结界面
        self.wd.execute_script("setTimeout(function(){debugger}, 5000);")

        # 等待5秒后, 浏览器进入调试模式, 界面被冻住
        time.sleep(5)

        # 点击已发布作业
        self.wd.find_element(By.CSS_SELECTOR, 'a[href="#/task_manage?tt=1"] .submenu-title').click()
        time.sleep(2)

        # 点击第一个作业的完成情况
        self.wd.find_elements(By.CSS_SELECTOR, '.tablelink .fa-search')[0].click()
        time.sleep(2)

        studentInfo = self.wd.find_elements(By.CSS_SELECTOR, '.tablesorter .ng-scope .ng-binding')[0].text

        return studentInfo


# 老师发布作业
    def publishEmptyHomework(self, homeworkName):
        # 找到'作业'元素并悬停鼠标
        homework = self.wd.find_elements(By.ID, 'members')[1]
        ActionChains(self.wd).move_to_element(homework).perform()

        # 等待动态元素出现, 如发布作业
        time.sleep(1)

        # 注入JavaScript代码, 5秒后冻结界面
        self.wd.execute_script("setTimeout(function(){debugger}, 5000);")

        # 等待5秒后, 浏览器进入调试模式, 界面被冻住
        time.sleep(5)

        # 点击创建作业
        self.wd.find_element(By.CSS_SELECTOR, 'a[ng-click="show_page_addexam()"] .submenu-title').click()
        time.sleep(2)

        # 编辑作业名字
        element = self.wd.find_element(By.ID, 'exam_name_text')
        element.send_keys(homeworkName)

        # 从题库中选择题目
        self.wd.find_element(By.ID, 'btn_pick_question').click()
        time.sleep(3)

        # 点击选择题目按钮后, 出现新的小界面(在原来的html中又包含了一个html)
        # 这时候需要使用switch_to.frame()进入到这个frame元素中, 才能访问其中的元素
        # !!!注意很重要!!!
        self.wd.switch_to.frame('pick_questions_frame')
        time.sleep(2)

        # 选择三道选择题
        self.wd.find_element(By.ID, 'ZJ_1_0_0_anchor').click()
        time.sleep(2)
        elements = self.wd.find_elements(By.CLASS_NAME, 'btn_pick_question')[:3]
        for ele in elements:
            ele.click()

        # 选择好题目之后 - 点击确定
        self.wd.find_element(By.CLASS_NAME, 'btn-blue').click()
        time.sleep(1)

        # 注意哦, 刚刚我们切换到iframe里面进行操作好了之后, 需要手动切换回原来的主html中
        # !!!注意很重要!!!
        self.wd.switch_to.default_content()
        time.sleep(2)

        # 点击确认添加
        self.wd.find_element(By.ID, 'btn_submit').click()
        time.sleep(3)

        return None


top = TeacherOp()
